# coding=utf-8
from flask import current_app, jsonify
from flask import g
from flask import request
from ihome import constants
from ihome import db
from ihome.api_1_0 import api
from ihome.models import User
from ihome.utils.commons import login_required
from ihome.utils.image_storage import storage
from ihome.utils.response_code import RET


@api.route('/user')
@login_required
def get_user_profile():
    """
    获取个人信息
    :return:
    """
    # 取到当前登录用户的id
    user_id = g.user_id
    # 查询当前登录用户
    try:
        user = User.query.filter_by(id=user_id).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='数据查询错误')
    # 如果用户不存在
    if user is None:
        return jsonify(errno=RET.USERERR, errmsg='用户不存在')
    return jsonify(errno=RET.OK, errmsg='OK', data=user.to_dict())


@api.route("/user/avatar", methods=["POST"])
@login_required
def set_user_avatar():
    """
    设置用户头像信息:
    0. todo: 判断用户是否登录
    # 1. 获取用户上传头像文件对象
    # 2. 把头像文件上传到七牛云
    # 3. 设置用户的头像记录
    # 4. 返回应答，上传头像成功
    """
    # 1. 获取用户上传头像文件对象
    file = request.files.get("avatar")

    if not file:
        return jsonify(errno=RET.PARAMERR, errmsg="缺少数据")

    # 2. 把头像文件上传到七牛云
    try:
        key = storage(file.read())
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR, errmsg="上传用户头像失败")

    # 3. 设置用户的头像记录
    # user_id = session.get("user_id")
    user_id = g.user_id

    try:
        user = User.query.get(user_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询用户信息失败")

    if not user:
        return jsonify(errno=RET.USERERR, errmsg="用户不存在")

    # 设置用户头像地址
    user.avatar_url = key

    try:
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="设置用户头像记录失败")

    # 4. 返回应答，上传头像成功
    avatar_url = constants.QINIU_DOMIN_PREFIX + key

    return jsonify(errno=RET.OK, errmsg="上传头像成功", data={"avatar_url": avatar_url})


@api.route('/user/name', methods=['PUT'])
@login_required
def set_user_name():
    """
    设置用户名
    1. 获取前端提交的数据,并判断数据是否有值
    2. 查询出指定user并更新"name"属性
    3. 返回修改结果
    :return:
    """
    # 1. 获取前端提交的数据，并判断数据是否有值
    resp_dict = request.json
    username = resp_dict.get("username")
    if username is None:
        return jsonify(errno=RET.PARAMERR, errmsg='参数错误')
    # 2.判断用户名是否重复
    try:
        user = User.query.filter(User.name == username).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询用户信息失败")
    if user:
        return jsonify(errno=RET.DATAEXIST, errmsg="用户名已存在")

    # 3.查询出指定user并更新"name"属性
    try:
        User.query.filter_by(id=g.user_id).update({'name': username})
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='更新数据出错')
    else:
        # 3.返回修改结果
        return jsonify(errno=RET.OK, errmsg='修改成功')


@api.route('/user/auth', methods=['POST'])
@login_required
def set_auth():
    """
    实名认证
    :return:
    """
    # 1. 获取服务器数据并判断
    req_dict = request.json
    real_name = req_dict.get('real_name')
    id_card = req_dict.get('id_card')
    if not all([real_name, id_card]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数错误')
    # 2. 获取当前用户的模型并更新认证信息
    user_id = g.user_id
    try:
        User.query.filter_by(id=user_id).update({"real_name": real_name, "id_card": id_card})
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg='认证信息保存失败')
    else:
        return jsonify(errno=RET.OK, errmsg='认证信息保存成功')


@api.route('/user/auth')
@login_required
def get_auth():
    """
    获取用户实名认证信息
    :return:
    """
    user_id = g.user_id
    try:
        user = User.query.filter_by(id=user_id).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='数据查询错误')
    # 如果用户不存在
    if user is None:
        return jsonify(errno=RET.SESSIONERR, errmsg='用户不存在')
    return jsonify(errno=RET.OK, errmsg='OK', data=user.auth_to_dict())
